﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2009-10-15
//
// Update Date :            
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


class FUI_Object;
class FUI_Layout;

struct FUI_INIT;

//----------------------------------------------------------------
// 必需指定函数
//----------------------------------------------------------------
// 注册贴图回调函数
// .filename 贴图文件路径
// .out_texw 返回贴图宽度（如果你的渲染器不处理传递尺寸信息，可以不用处理此值）
// .out_texh 返回贴图高度（如果你的渲染器不处理传递尺寸信息，可以不用处理此值）
// .return 返回贴图ID
typedef DWORD (FCALL* FUI_CreateTexFunc)(FUI_INIT* uit, const ACHAR* filename, funit& out_texw, funit& out_texh);
// 释放贴图回调函数
// .tex_id 贴图ID
typedef void  (FCALL* FUI_DestroyTexFunc)(FUI_INIT* uit, DWORD tex_id);
// 绘制贴图回调函数
// .tex_id 贴图ID
// .dst 目录区域
// .src 源区域
// .pic_size 图片文件尺寸（不是必须的）
// .color 颜色处理
// .sample 采样模式，详见EF_UI_TEXTURE_SAMPLE_MODE
// .reversal 翻转模式，0不翻转，1横向，2纵向，3横纵都翻
typedef void  (FCALL* FUI_RenderFunc)(FUI_INIT* uit, DWORD tex_id, fuRect* dst, fuRect* src, fuSize* pic_size, DWORD color, BYTE sample, BYTE reversal);
// 绘制2D线框贴图回调函数
// .dst 目标区域
// .color 绘制颜色
// .fill_it 是否是填充该区域，否则表示画边框
typedef void  (FCALL* FUI_DrawRectFunc)(FUI_INIT* uit, fuRect* dst, DWORD color, bool fill_it);
// 添加裁剪区或者去掉裁剪区
// .wnd_rc 裁剪目标区域，如果此值为0表示去掉裁剪区并恢复正常
typedef void  (FCALL* FUI_ClipFunc)(FUI_INIT* uit, fuRect* wnd_rc);
// 创建字体
// .name 字体名
// .size 字体尺寸
// .bold 是否粗体
// .smooth 是否是滑
// .return 返回字体ID
typedef DWORD (FCALL* FUI_CreateFntFunc)(FUI_INIT* uit, const ACHAR* name, BYTE size, bool bold, bool smooth);
// 查询字符宽度信息
// .fnt 字体ID
// .str 查询串
// .queryMaxLine 是否只查询象素最宽字串行，否则是查询所有行，此时pvInfo为数组首地址
// .vfq 输出最宽行或者所有行信息（此值为0时表示只查询串中的第一个字符，单字模式）
// .count 指明pvInfo数组数量（单字模式时返回单字的宽度）
// .fnt_h 返回的仅仅是一个字符的准确象素高度，不一定是字体高度
// .return 失败表示查询失败，可能是字体不存在
struct IFUI_FontQuery
{
    size_t nCharCount;              // 该行字符数量
    size_t nPixelWidth;             // 该行所占象素宽度（行高就是字体高度，因此不返回）
};
typedef bool (FCALL* FUI_QueryFntFunc)(FUI_INIT* uit, DWORD fnt, const WCHAR* str, bool queryMaxLine, IFUI_FontQuery* vfq, size_t& count, size_t& fnt_h);
// 释放字体
// .fnt_id 字体ID
typedef void  (FCALL* FUI_DestroyFntFunc)(FUI_INIT* uit, DWORD fnt_id);
// 绘制文字
// .dst 文字的渲染区域
// .str 渲染文字内容
// .fnt_id 所用字体ID
// .color 文字颜色
// .efc 效果类型，见EF_UI_TEXT_EFFECT_TYPE
// .efc_color 有效果时的效果颜色
// .flags 渲染对齐模式，见EF_UI_ALIGN_MODE
typedef void  (FCALL* FUI_DrawTextFunc)(FUI_INIT* uit, fuRect* dst, const WCHAR *str, DWORD fnt_id, DWORD color, BYTE efc, DWORD efc_color, BYTE flags);
// 加载文件到内存
typedef bool  (FCALL* FUI_LoadFileFunc)(FUI_INIT* uit, const ACHAR* file, FV_UI_BYTE& out);

//----------------------------------------------------------------
// 非必需指定函数
//----------------------------------------------------------------
// 自定义隐藏所有框架函数
// .layout 目标界面，具体能否隐藏由此函数决定（默认自动隐藏，除了设置始终可见的界面）
// .param 由调用FUI_System::HideAllDialog函数传递进来的参数
// .return 返回是否结束循环，否则会处理到所有显示中的界面
typedef bool  (FCALL* FUI_HideDialogFunc)(FUI_INIT* uit, FUI_Layout* layout, DWORD param);
// 获取字符串内容
// .lang_id 字符串ID，或者说是多语言ID
// .return 返回该ID对应的字符串首地址
typedef const WCHAR* (FCALL* FUI_GetStringFunc)(FUI_INIT* uit, DWORD lang_id);
// 声音播放事件
// .snd_type 事件类型
typedef void  (FCALL* FUI_PlaySndFunc)(FUI_INIT* uit, DWORD snd_type);
// UI消息预处理
// .obj 当前处理消息的对象，可通过obj->GetFrameData()得到所属界面
// .msg_id 消息ID
// .wparam 参数1
// .lparam 参数2
// .return 返回是否拦截消息泵消息，如果拦掉，则该界面不会收到此次消息
typedef bool  (FCALL* FUI_PreMessageFunc)(FUI_INIT* uit, FUI_Object* obj, FIDHASH msg_id, DWORD wparam, DWORD lparam);
// 复制数据到剪贴板
typedef bool  (FCALL* FUI_SetClipboardFunc)(FUI_INIT* uit, FUI_StringA& str);
// 从剪贴板限数据
typedef bool  (FCALL* FUI_GetClipboardFunc)(FUI_INIT* uit, FUI_StringA& str);


//----------------------------------------------------------------
// 初始化参数
//----------------------------------------------------------------
struct FAPI FUI_INIT
{
    FUI_DECLARE_STRUCT(FUI_INIT);

    HWND hwnd;                  // 主框架句柄
    funit wnd_w, wnd_h;         // 当前主窗口尺寸
    FUI_StringA base_dir;       // 工作目录
    DWORD userDT;               // 用户数据1
    DWORD_PTR userPTR;          // 用户数据2
    BYTE userDTV[32];           // 用户数据缓存

    FUI_CreateTexFunc create_tex;
    FUI_DestroyTexFunc destroy_tex;
    FUI_RenderFunc render_spr;
    FUI_DrawRectFunc drawrect;
    FUI_ClipFunc cliprect;
    FUI_CreateFntFunc create_fnt;
    FUI_QueryFntFunc query_fnt;
    FUI_DestroyFntFunc destroy_fnt;
    FUI_DrawTextFunc draw_text;
    FUI_LoadFileFunc load_file;

    // 可选参数
    FUI_HideDialogFunc hide_dialog;
    FUI_GetStringFunc get_string;
    FUI_PlaySndFunc play_snd;
    FUI_PreMessageFunc pre_msg_proc;
    FUI_SetClipboardFunc set_clipboard;
    FUI_GetClipboardFunc get_clipboard;

    FUI_INIT();
};


//----------------------------------------------------------------
// 渲染文字
//----------------------------------------------------------------
extern FAPI void FUI_DrawText(FUI_INIT* uit, fuRect* dstRect, const WCHAR *pString,
    DWORD nFontID = 0, DWORD fontColor = 0xFFFFFFFF,
    BYTE cEffect = eUTET_Normal, DWORD effectColor = 0xFF323232,
    BYTE dwFormat = eUAM_LeftTop);

extern FAPI void FUI_DrawTextEx(FUI_INIT* uit, funit nX, funit nY, const WCHAR *pString,
    DWORD nFontID = 0, DWORD fontColor = 0xFFFFFFFF,
    BYTE cEffect = eUTET_Normal, DWORD effectColor = 0xFF323232);